﻿//#define _CRT_SECURE_NO_WARNINGS
//#include <stdio.h>
//#include <windows.h>
//#include <string.h>
//#include <stdlib.h>

#include "common.h"

void printf_unsigned()
{
	unsigned int i;
	for (i = 9; i >= 0; --i)  // 提示循环无限执行
	{
		printf("i = %u \n", i);
		Sleep(500);  // 延时 0.5 秒
	}
}

int strlen_test()
{
	char arr[1000];
	int i;
	for (i = 0; i < 1000; ++i)
		arr[i] = -1 - i;
	// arr 存放 int 类型的 -1、-2、-3、...、-1000
	// 转换为 char 类型后  -1、-2、...、-128、127、126、...、1、0、-1、-2、...
	printf("strlen(arr) = %lld \n", strlen(arr));  // 255 strlen 的数组长度
	// strlen 只关注'\0'字符（对应整数 0），遇到 0 停止计算，统计之前的
	// 这里 char -129 = 127 char -130 = 126 因此输出数组长度为 255
	//printf("arr[257] = %d \n", arr[258]); // -3
	if (strlen("abc") - strlen("abcdef") >= 0)
		printf("大于零 >=\n"); // 打印这个（因为 size_t(无符号整数) -3 > 0）
	else
		printf("小于零 <\n");
	return sizeof(arr) / sizeof(arr[0]); // 1000
}

void printf_float()
{
	long long a = 10;
	// 二进制存储为：00000000 00000000 00000000 00001010
	float* pfa = (float*)&a;
	printf("a = %lld, *pfa = %f \n", a, *pfa);
	/* *pfa 按照 IEEE 754 规则读取时：
		0 00000000 00000000000000000001010
		转为：(-1)^0 * 0.00000000000000000001010 * 2^-126   很接近 0 */
	*pfa = 10;  // 浮点数 10
	printf("a = %lld, *pfa = %f \n", a, *pfa);
	/* 浮点数 10 转为二进制过程：
		整数 10 = 1010 = 1.010 * 2^3 = (-1)^0 * 1.010 * 2^3
		按照 IEEE 754 规则存储时：S = 0， M = 010， E = 127 + 3 = 130
		二进制数表示为：0 10000010 010 00000000000000000000  (0x 41 20 00 00)
		这里以如果整数的形式读取，得到：1092616192 */
	printf("sizeof a = %lld\n", sizeof(a));  // a 的类型没有改变
}

void odd_even_sort1(int arr[], int left, int right)
{ // 奇偶排序，奇前偶后，不考虑真正的顺序
	int temp;
	while (left < right)
	{
		while (left < right && 1 == arr[left] % 2)
			// 添加 left < right 条件，避免数组越界访问
			++left;
		while (left < right && 0 == arr[right] % 2)
			--right;
		temp = arr[left];
		arr[left] = arr[right];
		arr[right] = temp;
	}
}

void odd_even_sort2(int arr[], int left, int right)
{ // 奇偶排序，奇前偶后，不考虑真正的顺序，不改变原数组奇数的相对顺序，偶数的相对顺序
	int i, temp, count = 0;
	int* arr_copy = (int*)malloc(sizeof(int) * (right - left + 1)); // 复制数组用
	for (i = left; i <= right; ++i)
		if (1 == arr[i] % 2)  // 奇数
		{
			++count;
			arr_copy[count - 1] = arr[i];
		}
	for (i = left; i <= right; ++i)
		if (0 == arr[i] % 2)  // 偶数
		{
			++count;
			arr_copy[count - 1] = arr[i];
		}
	for (i = left; i <= right; ++i)
		arr[i] = arr_copy[i];
}

int* two_sorted_arr_merge(int* arr1, int len1, int* arr2, int len2)
{ // 合并两个有序数组，返回合并后的数组
	if (arr1 == NULL && arr2 == NULL)
		return NULL;
	int* arr = (int*)malloc(sizeof(int) * (len1 + len2));
	if (arr == NULL)
		return NULL;
	int i = 0, j = 0, k = 0;
    if (!arr1 && arr2)
        return arr2;
    else if (arr1 && !arr2)
        return arr1;

	while (i < len1 && j < len2)
	{
		if (arr1 && arr2 && arr1[i] < arr2[j])
			arr[k++] = arr1[i++];
		else if (arr2)
			arr[k++] = arr2[j++];
	}
    if (arr1)
	    while (i < len1) // 保证后部分数组大值上面循环没有复制的数据能全部复制到新数组
		    arr[k++] = arr1[i++];
	while (j < len2)
		arr[k++] = arr2[j++];
	return arr;
}
